"""
日志工具模块，提供应用程序的日志记录功能
"""
import logging
import os
import sys
from pathlib import Path
from datetime import datetime

# 日志级别映射
LOG_LEVELS = {
    "debug": logging.DEBUG,
    "info": logging.INFO,
    "warning": logging.WARNING,
    "error": logging.ERROR,
    "critical": logging.CRITICAL
}

# 默认日志格式
DEFAULT_LOG_FORMAT = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
DETAILED_LOG_FORMAT = "%(asctime)s [%(levelname)s] %(name)s (%(filename)s:%(lineno)d): %(message)s"

def setup_logger(
    name: str = None,
    level: str = "info",
    log_file: str = None,
    use_console: bool = True,
    detailed: bool = True,
):
    """
    设置并返回一个日志记录器
    
    参数:
        name: 日志记录器名称
        level: 日志级别 (debug, info, warning, error, critical)
        log_file: 日志文件路径，如果为None则使用默认路径
        use_console: 是否在控制台打印日志
        detailed: 是否使用详细的日志格式
    
    返回:
        配置好的日志记录器
    """
    # 获取日志级别
    log_level = LOG_LEVELS.get(level.lower(), logging.INFO)
    
    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(log_level)
    logger.handlers = []  # 清除已有的处理器
    
    # 设置日志格式
    log_format = DETAILED_LOG_FORMAT if detailed else DEFAULT_LOG_FORMAT
    formatter = logging.Formatter(log_format)
    
    # 添加控制台处理器
    if use_console:
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setFormatter(formatter)
        logger.addHandler(console_handler)
    
    # 如果没有提供日志文件路径，使用默认路径
    if log_file is None:
        # 从配置中获取LOG_DIR
        try:
            from config.settings import LOG_DIR, LOG_LEVEL
            
            # 确保name不为空
            module_name = name or "app"
            
            # 创建按日期命名的日志文件
            current_date = datetime.now().strftime("%Y-%m-%d")
            log_file = LOG_DIR / f"{module_name}_{current_date}.log"
            
            # 使用配置中的日志级别
            log_level = LOG_LEVELS.get(LOG_LEVEL.lower(), logging.INFO)
            logger.setLevel(log_level)
        except (ImportError, AttributeError):
            # 配置模块不可用，不写入文件
            pass
    
    # 添加文件处理器
    if log_file:
        try:
            # 确保日志目录存在
            log_path = Path(log_file).parent
            os.makedirs(log_path, exist_ok=True)
            
            file_handler = logging.FileHandler(str(log_file), encoding="utf-8")
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)
        except Exception as e:
            # 添加文件处理器失败，记录错误但继续运行
            sys.stderr.write(f"Error setting up log file {log_file}: {str(e)}\n")
    
    return logger

def get_default_logger():
    """
    获取默认的应用日志记录器
    """
    from config.settings import LOG_DIR, LOG_LEVEL
    
    # 日志文件名包含日期
    current_date = datetime.now().strftime("%Y-%m-%d")
    log_file = LOG_DIR / f"app_{current_date}.log"
    
    return setup_logger(
        name="mcp_assistant",
        level=LOG_LEVEL,
        log_file=str(log_file),
        use_console=True,
        detailed=True
    )